import os

from django.conf import settings
from django.template import loader

from apps.contents.models import ContentCategory, Content
from apps.goods.models import SKUImage, GoodsChannel, GoodsCategory


def get_categories():
    # 模版参数categories是首页分类频道,里面包含所有频道数据以及商品分类的信息
    # 1：首先分析前段页面最外层是个字典数据，所以先定义一个字典，以后向里面增加数据。
    categories = {}

    # 获取首页所有的分类频道数据
    # 获取商品频道集
    # 先按频道组分类，如果频道相同，就按照sequence(商品分类所在频道组的位置)分类
    channels = GoodsChannel.objects.order_by(
        'group_id',
        'sequence'
    )

    # 遍历所有的商品频道，构建以组号作为key的键值对  channels ：商品频道集 channel：某个商品频道
    for channel in channels:
        # channel: GoodsChannel对象
        # 如果该商品频道的频道组没有在（最外层）频道字典中
        if channel.group_id not in categories:
            # 将这个频道的频道组id，作为频道字典的一个键
            categories[channel.group_id] = {
                'channels': [],  # 当前分组中的分类频道(一级分类)
                'sub_cats': []  # 二级分类
            }
        # (1)、填充当前组中的一级分类
        # 某个商品频道的category属性获的商品分类对象：例如 ： 手机 数码等
        cat1 = channel.category
        # 给一级分类追加数据
        categories[channel.group_id]['channels'].append({
            'id': cat1.id,
            'name': cat1.name,
            'url': channel.url
        })



        # (2)、填充当前组中的二级分类
        # 商品分类表对象获得二级商品分类（父亲是一级商品分类的）
        cat2s = GoodsCategory.objects.filter(parent=cat1)
        for cat2 in cat2s:
            # cat2：二级分类对象

            cat3_list = []  # 每一次遍历到一个二级分类对象的时候，初始化一个空列表，用来构建三级分类
            cat3s = GoodsCategory.objects.filter(parent=cat2)
            # (3)、填充当前组中的三级分类
            for cat3 in cat3s:
                # cat3；三级分类对象
                cat3_list.append({
                    'id': cat3.id,
                    'name': cat3.name
                })

            #将三级分类列表加入二级分类中
            categories[channel.group_id]['sub_cats'].append({
                'id': cat2.id,
                'name': cat2.name,
                'sub_cats': cat3_list  # 三级分类
            })

    return categories


def get_contents():
    contents = {}
    # 所有广告分类
    # 用广告分类表对象获取所有的广告分类
    content_cats = ContentCategory.objects.all()
    # 遍历所有的广告分类，获取其中一个广告分类。
    for content_cat in content_cats:
        # content_cat: 每一个分类如：轮播图
        # 当前广告分类关联的所有广告加入列表中
        # contents['index_lbt'] = [<美图M8s>, <黑色星期五>...]
        # 广告分类表中有个key字段，这个字段表示是哪个广告分类。
        contents[content_cat.key] = Content.objects.filter(
            #广告表中的category_id等于广告分类表的id
            category=content_cat,
            status=True  # 正在展示的广告
        ).order_by('sequence')
    return contents



def generate_static_index_html():

    # 获取分类频道
    categories = get_categories()
    contents = get_contents()

    # 1:构建首页模板文件对象
    template = loader.get_template("index.html")

    # 2:构造动态数据
    content = {
        "categories": categories,
        "contents": contents,
    }

    # 3:渲染完整的页面数据
    page = template.render(content)

    # 4:写入静态web服务器
    file_path = os.path.join(settings.STATIC_FILE_PATH, 'index.html')
    with open(file_path, "w") as f:
        f.write(page)
